/*
    数位dp-上

    前置知识: 
    讲解003、030、031、032、033 - 位运算基础
    讲解066、067、068、069 - 动态规划基础
    【必备】课程的动态规划大专题从讲解066开始，建议从头开始学习会比较系统

    数位dp的尝试方式并不特殊，绝大多数都是线性展开，类似从左往右的尝试
    之前的课已经讲过 大量在数组上进行线性展开的题目，数位dp是在数字的每一位上进行线性展开而已
    不同的题目有不同的限制，解题核心在于：可能性的整理、排列组合的相关知识

    解决数位dp的问题 推荐使用记忆化搜索的方式，可能性的展开会很好写，不必刻意追求进一步改写
    递归写出来问题就解决了，位数多就挂缓存，位数不多甚至不挂缓存也能通过

    数位dp分为上、下节，本节为上期，会讲解4个题目，来熟悉数位dp

    ================================================

    题目1
    统计各位数字都不同的数字个数
    给你一个整数n，代表十进制数字最多有n位
    如果某个数字，每一位都不同，那么这个数字叫做有效数字
    返回有效数字的个数，不统计负数范围
    测试链接 : https://leetcode.cn/problems/count-numbers-with-unique-digits/

    ================================================

    题目2
    最大为N的数字组合
    给定一个按 非递减顺序 排列的数字数组 digits
    已知digits一定不包含'0'，可能包含'1' ~ '9'，且无重复字符
    你可以用任意次数 digits[i] 来写的数字
    例如，如果 digits = ['1','3','5']
    我们可以写数字，如 '13', '551', 和 '1351315'
    返回 可以生成的小于或等于给定整数 n 的正整数的个数
    测试链接 : https://leetcode.cn/problems/numbers-at-most-n-given-digit-set/

    ================================================

    题目3
    统计整数数目
    给你两个数字字符串 num1 和 num2 ，以及两个整数max_sum和min_sum
    如果一个整数 x 满足以下条件，我们称它是一个好整数
    num1 <= x <= num2
    min_sum <= digit_sum(x) <= max_sum
    请你返回好整数的数目，答案可能很大请返回答案对10^9 + 7 取余后的结果
    注意，digit_sum(x)表示x各位数字之和
    测试链接 : https://leetcode.cn/problems/count-of-integers/

    ================================================

    题目4
    完全没有重复的数字个数
    给定正整数n，返回在[1, n]范围内每一位都互不相同的正整数个数
    测试链接 : https://leetcode.cn/problems/count-special-integers/

    至少有1位重复的数字个数
    给定正整数n，返回在[1, n]范围内至少有1位重复数字的正整数个数
    测试链接 : https://leetcode.cn/problems/numbers-with-repeated-digits/

*/